library(png)
format(Sys.time(), format="%d_%b_%Y")
[1] "27_Feb_2017"
## First consolidate the available files into a single table
    
      path <- "~/Box Sync/Four model compare/Module 2 extinct"
           
     
           setwd(path)
Error in setwd(path) : cannot change working directory
setwd("~/Box Sync/colliding ranges/Simulations_humans/Results/available daily summaries")
The working directory was changed to /Users/Ty/Box Sync/colliding ranges/Simulations_humans/Results/available daily summaries inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the the working directory for notebook chunks.
details <- file.info(list.files())
trimmed_details <- details[which(list.files() == list.files(pattern = "Four_model_compare_results_extinct*")),]
ord <- order(trimmed_details$mtime, decreasing = TRUE)
rownames(trimmed_details[ord,])[1]
[1] "Four_model_compare_results_extinct_27_Feb_2017.Rdata"
load(rownames(trimmed_details[ord,])[1])
extinct <- Concatenated_data
trimmed_details <- details[which(list.files() != list.files(pattern = "Four_model_compare_results_extinct*")),]
ord <- order(trimmed_details$mtime, decreasing = TRUE)
rownames(trimmed_details[ord,])[1]
[1] "Four_model_compare_results_27_Feb_2017_crop_to_2861.Rdata"
load(rownames(trimmed_details[ord,])[1])
extant <- Concatenated_data
for(i in c(9,10,11,12,14,15,16,17,19,20,21,22,24,25,26,27,29,30,31,32)){
    extinct[which(is.nan(as.numeric(as.character(extinct[, i]))) == TRUE), i] <- NA
}
for(i in c(9,10,11,12,14,15,16,17,19,20,21,22,24,25,26,27,29,30,31,32)){
    extant[which(is.nan(as.numeric(as.character(extant[, i]))) == TRUE), i] <- NA
}
i <- 19
for(i in c(20,21,24,25,26,27)){
    extinct[which(as.numeric(as.character(extinct[, i])) == 0), i] <- NA
}
for(i in c(20,21,24,25,26,27)){
    extant[which(as.numeric(as.character(extant[, i])) == 0), i] <- NA
}
xlimit <- c(0,1)
ylimit <- c(0,600)
maincex <- 0.9
png(file="Global_success_rate_per_parameter.png", width=8.5, height=11, units="in", res=300)
par(mfrow=c(5,4), mar=c(3,3,3,0))
hist(as.numeric(as.character(extinct[,9])), main="speciation of F in F env", col=adjustcolor("firebrick", alpha=0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[,9])), main="speciation of F in F env", col=adjustcolor("cornflowerblue", alpha=0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[,10])), main="speciation of D in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[,10])), main="speciation of D in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[,11])), main="speciation of F in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[,11])), main="speciation of F in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[,12])), main="speciation of D in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[,12])), main="speciation of D in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
#######
hist(as.numeric(as.character(extinct[, 14])), main="extinction of F in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 14])), main="extinction of F in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 15])), main="extinction of D in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 15])), main="extinction of D in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 16])), main="extinction of F in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 16])), main="extinction of F in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 17])), main="extinction of D in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 17])), main="extinction of D in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
######
hist(as.numeric(as.character(extinct[, 29])), main="arisal of F in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 29])), main="arisal of F in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 30])), main="arisal of D in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 30])), main="arisal of D in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 31])), main="arisal of F in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 31])), main="arisal of F in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 32])), main="arisal of D in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 32])), main="arisal of D in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
######
hist(as.numeric(as.character(extinct[, 19])), main="NOPE -- Diffusion: source F, target F", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= c(0,18000), cex.main= maincex)
hist(as.numeric(as.character(extant[, 19])), main="NOPE -- Diffusion: source F, target F", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= c(0,18000), cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 20])), main="Diffusion: source D, target F", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 20])), main="Diffusion: source D, target F", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 21])), main="Diffusion: source F, target D", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 21])), main="Diffusion: source F, target D", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 22])), main="NOPE -- Diffusion: source D, target D", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= c(0,18000), cex.main= maincex)
hist(as.numeric(as.character(extant[, 22])), main="NOPE -- Diffusion: source D, target D", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= c(0,18000), cex.main= maincex, add=TRUE)
####
hist(as.numeric(as.character(extinct[, 24])), main="Takeover: source F, target F", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 24])), main="Takeover: source F, target F", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 25])), main="Takeover: source D, target F", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 25])), main="Takeover: source D, target F", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 26])), main="Takeover: source F, target D", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 26])), main="Takeover: source F, target D", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 27])), main="Takeover: source D, target D", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 27])), main="Takeover: source D, target D", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
dev.off()
null device 
          1 
png(file="extiction minus extant per outcome.png", width=8.5, height=11, units="in", res=300)
par(mfrow=c(3,1))
plot(as.numeric(as.character(extinct[,9])), as.numeric(as.character(extinct[,14])), xlab="speciation", ylab="extinction", col= adjustcolor("firebrick", alpha=0.2), pch=19, cex=0.6, ylim=c(0,1))
plot(as.numeric(as.character(extant[,9])), as.numeric(as.character(extant[,14])), xlab="speciation", ylab="extinction", col= adjustcolor("cornflowerblue", alpha=0.2), pch=19, cex=0.6, ylim=c(0,1))
plot(as.numeric(as.character(extinct[,9])), as.numeric(as.character(extinct[,14])), xlab="speciation", ylab="extinction", col= adjustcolor("firebrick", alpha=0.2), pch=19, cex=0.6, ylim=c(0,1))
points(as.numeric(as.character(extant[,9])), as.numeric(as.character(extant[,14])), xlab="speciation", ylab="extinction", col= adjustcolor("cornflowerblue", alpha=0.2), pch=19, cex=0.6)
dev.off()
null device 
          1 
load('~/Box Sync/colliding ranges/Simulations_humans/Available trees/real.analysis.RData')
#Concatenated_data <- Concatenated_data[Concatenated_data[, 2] == "stats.no.bTO", ]
#Concatenated_data <- Concatenated_data[Concatenated_data[, 6] != "05", ]
# Concatenated_data[, 6] <- as.numeric(Concatenated_data[, 6])
# # Concatenated_data[original[, 2] == "background_takeover", 6] <-  Concatenated_data[original[, 2] == "background_takeover", 6] + 4
Concatenated_data[, 6] <- factor(Concatenated_data[, 6])
#head(Concatenated_data)
#names(Concatenated_data)
PCAdata <- Concatenated_data[, -(1:35)]
PCAdata <- PCAdata[, -12]
PCAdata <- apply(PCAdata, 2, as.numeric)
remove <- apply(is.na(PCAdata), 1, any)
PCAdata <- PCAdata[!remove, ]
# Predictions
library(randomForest)
data.analysis.comp2 <- data.frame("Model" = as.factor(Concatenated_data[!remove, 6]),
                                  PCAdata)
data.analysis.comp2$sprate <- data.analysis.comp2$trait_1_speciation/data.analysis.comp2$trait_2_speciation
data.analysis.comp2$extrate <- data.analysis.comp2$trait_1_extinction/data.analysis.comp2$trait_2_extinction
#load("Real_phy/real.analysis.RData")
a <- as.data.frame(real.analysis$results_summary_of_single_value_outputs)
a$sprate <- a$trait_1_speciation / a$trait_2_speciation
a$extrate <- a$trait_1_extinction / a$trait_2_extinction
data.analysis.comp3 <- data.analysis.comp2[, -c(2, 13:14, 16:20)]
#data.analysis.comp3 <- data.analysis.comp3[data.analysis.comp3$Model %in% 1:4, ]
#data.analysis.comp3$Model <- factor(data.analysis.comp3$Model)
#sub <- unlist(lapply(as.list(c(1:4)), function(x, y) {
#  sample(which(y$Model == x), min(table(data.analysis.comp3$Model)))},
#  y = data.analysis.comp3))
# data.analysis.comp3 <- data.analysis.comp3[sub, ]
fun <- function(x, y, per = .33) {sample(which(y$Model == x), round(table(y$Model)[1]*per))}
sub.test <- unlist(lapply(as.list(paste0(0, c(1:4))), fun,
                          y = data.analysis.comp3))
test2 <- data.analysis.comp3[sub.test, 2:ncol(data.analysis.comp3)]
test1 <- data.analysis.comp3[sub.test, 1]
train <- data.analysis.comp3[-sub.test, ]
(fit <- randomForest(Model ~ ., data=train, xtest = test2, ytest = test1, 
                    importance=TRUE, ntree=2400, keep.forest = TRUE, replace=TRUE, norm.votes=FALSE))

Call:
 randomForest(formula = Model ~ ., data = train, xtest = test2,      ytest = test1, importance = TRUE, ntree = 2400, keep.forest = TRUE,      replace = TRUE, norm.votes = FALSE) 
               Type of random forest: classification
                     Number of trees: 2400
No. of variables tried at each split: 4

        OOB estimate of  error rate: 36.25%
Confusion matrix:
     01   02   03 04 class.error
01 2796  579  473  8   0.2748963
02  669 2642  214 29   0.2566123
03  809  295 1060 25   0.5157606
04   63  441  121 55   0.9191176
                Test set error rate: 48.7%
Confusion matrix:
     01   02  03 04 class.error
01 1430  258 208  3   0.2469721
02  332 1440 105 22   0.2417062
03  679  258 939 23   0.5055292
04  183 1257 371 88   0.9536598
predictions <- predict(fit, 
                       a,
                       type="prob")
plot(fit, ylim=c(0,1))

labs <- c("Basic", "+Diffusion", "+Takeover", "+Diffusion +Takeover")
# bar plot
png("Prob_aus.png", width = 25, height = 25, res = 300, units = "in")
par(mar = c(8, 8, 1, 1))
pred <- setNames(as.numeric(predictions), labs)
cols <- rev(c("darkgreen", "red", "blue", "darkorange1"))
barplot(pred, col = cols, ylab = "Proability", cex.lab = 3, cex.names = 2)
dev.off()
null device 
          1 
prop
          01        02        03        04
01 62.280130 13.723696 21.829763  4.678007
02 13.289902 64.409881  8.627678 27.764277
03 20.065147  4.757548 53.503185 13.912515
04  4.364821 17.108875 16.039375 53.645200
importance(fit)
                                                   01        02        03
Pylo_diversity_is_sum_of_BL                  36.27731 26.313769 38.900228
average_phylogenetic_diversity_is_mean_of_BL 42.47717 32.482005 38.519904
variance_Pylo_diversity_is_variance_of_BL    42.15824 16.661635  9.266383
F_quadratic_entropy_is_sum_of_PD             24.95204 19.851036 36.048651
Mean_pairwise_distance                       31.03797 25.728248 33.157743
variance_pairwise_distance                   31.43706 29.867035 34.057818
Evolutionary_distinctiveness_sum             36.73711 26.605041 37.480353
mean_Phylogenetic_isolation                  40.52562 33.527197 41.801064
variance_Phylogenetic_isolation              24.57867  8.325148 37.260442
gamma                                        26.36037 21.591877 63.126688
extinction_per_speciation                     7.99549 41.950330 54.475002
transition_from_trait_1_to_2                 22.53100 22.856490 41.900317
transition_from_trait_2_to_1                 33.37167 33.715083 45.090491
transition_rate_ratio_1to2_over_2to1         50.20133 36.600927 35.430284
Phylogenetic_signal                          64.80645 43.118360 53.232738
spatial.tests.fora                           43.20987 86.600931 89.746230
spatial.tests.dom                            82.03166 30.318014 47.558336
prevalence                                   54.14112  9.616747 35.927323
sprate                                       41.34870 28.286586 85.062626
extrate                                      28.88581 24.078228 21.624649
                                                   04 MeanDecreaseAccuracy
Pylo_diversity_is_sum_of_BL                  45.76293             62.84990
average_phylogenetic_diversity_is_mean_of_BL 32.73694             67.29494
variance_Pylo_diversity_is_variance_of_BL    27.05678             54.35726
F_quadratic_entropy_is_sum_of_PD             43.18824             68.31908
Mean_pairwise_distance                       42.30806             63.22960
variance_pairwise_distance                   22.73712             60.82865
Evolutionary_distinctiveness_sum             44.98800             63.01409
mean_Phylogenetic_isolation                  33.38172             68.79250
variance_Phylogenetic_isolation              22.99055             49.94780
gamma                                        51.68400             89.28718
extinction_per_speciation                    54.09510             75.50858
transition_from_trait_1_to_2                 41.11630             58.91197
transition_from_trait_2_to_1                 40.76374             67.48847
transition_rate_ratio_1to2_over_2to1         42.40223             85.56456
Phylogenetic_signal                          40.17895             85.09066
spatial.tests.fora                           76.44656            125.15481
spatial.tests.dom                            53.97271            104.59956
prevalence                                   58.91447             79.90220
sprate                                       36.41170             92.93119
extrate                                      36.77120             58.20976
                                             MeanDecreaseGini
Pylo_diversity_is_sum_of_BL                          210.2330
average_phylogenetic_diversity_is_mean_of_BL         182.1725
variance_Pylo_diversity_is_variance_of_BL            164.4793
F_quadratic_entropy_is_sum_of_PD                     185.9903
Mean_pairwise_distance                               206.3388
variance_pairwise_distance                           183.6735
Evolutionary_distinctiveness_sum                     207.9225
mean_Phylogenetic_isolation                          184.8331
variance_Phylogenetic_isolation                      167.5043
gamma                                                213.3865
extinction_per_speciation                            251.9260
transition_from_trait_1_to_2                         255.1930
transition_from_trait_2_to_1                         262.6217
transition_rate_ratio_1to2_over_2to1                 211.2503
Phylogenetic_signal                                  303.1266
spatial.tests.fora                                   395.4726
spatial.tests.dom                                    250.7786
prevalence                                           226.0943
sprate                                               244.7882
extrate                                              190.3293
# Variables importance
imp <- importance(fit)
imp <- apply(imp, 2, function(x) (x - min(x))/(max(x) - min(x)))
imp <- imp[sort(imp[, 5], index.return = TRUE, decreasing = TRUE)$ix, ]
names <- rownames(imp)
names[names == "spatial.tests.fora"] <- "Space F"
names[names == "spatial.tests.dom"] <- "Space D"
names[names == "sprate"] <- "Sp(ratio)"
names[names == "transition_from_trait_1_to_2"] <- "TR(1-2)"
names[names == "transition_from_trait_2_to_1"] <- "TR(2-1)"
names[names == "Phylogenetic_signal"] <- "PhySig(D)"
names[names == "Evolutionary_distinctiveness_sum"] <- "EDsum"
names[names == "Pylo_diversity_is_sum_of_BL"] <- "PDsum"
names[names == "transition_rate_ratio_1to2_over_2to1"] <- "TR(ratio)"
names[names == "gamma"] <- "Gamma"
names[names == "mean_Phylogenetic_isolation"] <- "MPI"
names[names == "extrate"] <- "Ext(ratio)"
names[names == "average_phylogenetic_diversity_is_mean_of_BL"] <- "PDmean"
names[names == "extinction_per_speciation"] <- "DR"
names[names == "variance_Phylogenetic_isolation"] <- "VPI"
names[names == "F_quadratic_entropy_is_sum_of_PD"] <- "F"
names[names == "Mean_pairwise_distance"] <- "MPD"
names[names == "variance_Pylo_diversity_is_variance_of_BL"] <- "PDvar"
names[names == "variance_pairwise_distance"] <- "VPD"
png("var_import_all.png", width = 25, height = 25, unit="in", res=300)
par(mar = c(10, 18, 1, 1))
plot(x = rev(imp[, 5]), y = 1:nrow(imp), type = "l", yaxt = "n", 
     ylab = "", xlab = "Variable Importance",
     xlim = c(0, 1), lwd = 2, cex.lab = 4)
for (i in 1:nrow(imp)) {
  abline(h = i, lty = 3, col = "gray80")
}
abline(v = seq(0, 1, 1/19), lty = 3, col = "gray80")
lines(x = rev(imp[, 4]), y = 1:nrow(imp), col = "darkgreen", lwd = 2)
lines(x = rev(imp[, 3]), y = 1:nrow(imp), col = "red", lwd = 2)
lines(x = rev(imp[, 2]), y = 1:nrow(imp), col = "blue", lwd = 2)
lines(x = rev(imp[, 1]), y = 1:nrow(imp), col = "darkorange1", lwd = 2)
lines(x = rev(imp[, 5]), y = 1:nrow(imp), lwd = 3)
points(x = rev(imp[, 4]), y = 1:nrow(imp), col = "darkgreen", cex = 2)
points(x = rev(imp[, 3]), y = 1:nrow(imp), col = "red", cex = 2)
points(x = rev(imp[, 2]), y = 1:nrow(imp), col = "blue", cex = 2)
points(x = rev(imp[, 1]), y = 1:nrow(imp), col = "darkorange1", cex = 2)
points(x = rev(imp[, 5]), y = 1:nrow(imp), pch = 20, cex = 3)
text(y = 1:nrow(imp), x = par("usr")[1] - .17, labels = rev(names),
     srt = 0, pos = 4, xpd = T, cex = 4)
dev.off()
null device 
          1 
par(mfrow=c(2,3))
# Box plots
boxplot(spatial.tests.fora ~ Model, data = data.analysis.comp3)
abline(h = a$spatial.tests.fora, col = "red", lty = 2)
boxplot(spatial.tests.dom ~ Model, data = data.analysis.comp3)
abline(h = a$spatial.tests.fora, col = "red", lty = 2)
boxplot(log(sprate) ~ Model, data = data.analysis.comp3, ylim = c(-10, 10))
abline(h = log(a$sprate), col = "red", lty = 2)
boxplot(log(extrate) ~ Model, data = data.analysis.comp3, ylim = c(-10, 10))
abline(h = log(a$extrate), col = "red", lty = 2)
boxplot(log(transition_rate_ratio_1to2_over_2to1) ~ Model, data = data.analysis.comp3)
abline(h = log(a$sprate), col = "red", lty = 2)
boxplot(Phylogenetic_signal ~ Model, data = data.analysis.comp3, ylim = c(0, 1))
abline(h = a$Phylogenetic_signal, col = "red", lty = 2)

str(fit)
List of 19
 $ call           : language randomForest(formula = Model ~ ., data = train, xtest = test2, ytest = test1,      importance = TRUE, ntree = 2400, keep.forest = TRUE)
 $ type           : chr "classification"
 $ predicted      : Factor w/ 4 levels "01","02","03",..: 1 3 1 1 3 3 3 1 3 1 ...
  ..- attr(*, "names")= chr [1:8885] "1" "2" "3" "4" ...
 $ err.rate       : num [1:2400, 1:5] 0.547 0.547 0.549 0.535 0.533 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:5] "OOB" "01" "02" "03" ...
 $ confusion      : num [1:4, 1:5] 1392 298 434 90 230 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:4] "01" "02" "03" "04"
  .. ..$ : chr [1:5] "01" "02" "03" "04" ...
 $ votes          : matrix [1:8885, 1:4] 0.549 0.346 0.906 0.902 0.22 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:8885] "1" "2" "3" "4" ...
  .. ..$ : chr [1:4] "01" "02" "03" "04"
  ..- attr(*, "class")= chr [1:2] "matrix" "votes"
 $ oob.times      : num [1:8885] 907 876 855 911 850 863 879 836 883 902 ...
 $ classes        : chr [1:4] "01" "02" "03" "04"
 $ importance     : num [1:20, 1:6] 0.0248 0.0262 0.0149 0.012 0.0186 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "Pylo_diversity_is_sum_of_BL" "average_phylogenetic_diversity_is_mean_of_BL" "variance_Pylo_diversity_is_variance_of_BL" "F_quadratic_entropy_is_sum_of_PD" ...
  .. ..$ : chr [1:6] "01" "02" "03" "04" ...
 $ importanceSD   : num [1:20, 1:5] 0.000668 0.000584 0.00033 0.000355 0.000494 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "Pylo_diversity_is_sum_of_BL" "average_phylogenetic_diversity_is_mean_of_BL" "variance_Pylo_diversity_is_variance_of_BL" "F_quadratic_entropy_is_sum_of_PD" ...
  .. ..$ : chr [1:5] "01" "02" "03" "04" ...
 $ localImportance: NULL
 $ proximity      : NULL
 $ ntree          : num 2400
 $ mtry           : num 4
 $ forest         :List of 14
  ..$ ndbigtree : int [1:2400] 3853 3761 3829 3805 3823 3977 3887 3917 3887 3907 ...
  ..$ nodestatus: int [1:4035, 1:2400] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ bestvar   : int [1:4035, 1:2400] 13 8 11 16 7 17 10 7 18 11 ...
  ..$ treemap   : int [1:4035, 1:2, 1:2400] 2 4 6 8 10 12 14 16 18 20 ...
  ..$ nodepred  : int [1:4035, 1:2400] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ xbestsplit: num [1:4035, 1:2400] 193.4137 0.0287 0.9995 25.8679 33.4238 ...
  ..$ pid       : num [1:4] 1 1 1 1
  ..$ cutoff    : num [1:4] 0.25 0.25 0.25 0.25
  ..$ ncat      : Named int [1:20] 1 1 1 1 1 1 1 1 1 1 ...
  .. ..- attr(*, "names")= chr [1:20] "Pylo_diversity_is_sum_of_BL" "average_phylogenetic_diversity_is_mean_of_BL" "variance_Pylo_diversity_is_variance_of_BL" "F_quadratic_entropy_is_sum_of_PD" ...
  ..$ maxcat    : int 1
  ..$ nrnodes   : int 4035
  ..$ ntree     : num 2400
  ..$ nclass    : int 4
  ..$ xlevels   :List of 20
  .. ..$ Pylo_diversity_is_sum_of_BL                 : num 0
  .. ..$ average_phylogenetic_diversity_is_mean_of_BL: num 0
  .. ..$ variance_Pylo_diversity_is_variance_of_BL   : num 0
  .. ..$ F_quadratic_entropy_is_sum_of_PD            : num 0
  .. ..$ Mean_pairwise_distance                      : num 0
  .. ..$ variance_pairwise_distance                  : num 0
  .. ..$ Evolutionary_distinctiveness_sum            : num 0
  .. ..$ mean_Phylogenetic_isolation                 : num 0
  .. ..$ variance_Phylogenetic_isolation             : num 0
  .. ..$ gamma                                       : num 0
  .. ..$ extinction_per_speciation                   : num 0
  .. ..$ transition_from_trait_1_to_2                : num 0
  .. ..$ transition_from_trait_2_to_1                : num 0
  .. ..$ transition_rate_ratio_1to2_over_2to1        : num 0
  .. ..$ Phylogenetic_signal                         : num 0
  .. ..$ spatial.tests.fora                          : num 0
  .. ..$ spatial.tests.dom                           : num 0
  .. ..$ prevalence                                  : num 0
  .. ..$ sprate                                      : num 0
  .. ..$ extrate                                     : num 0
 $ y              : Factor w/ 4 levels "01","02","03",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "names")= chr [1:8885] "1" "2" "3" "4" ...
 $ test           :List of 5
  ..$ predicted: Factor w/ 4 levels "01","02","03",..: 1 3 1 1 1 3 1 3 2 1 ...
  .. ..- attr(*, "names")= chr [1:188] "1410" "86" "2307" "1834" ...
  ..$ err.rate : num [1:2400, 1:5] 0.559 0.537 0.473 0.479 0.473 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : NULL
  .. .. ..$ : chr [1:5] "Test" "01" "02" "03" ...
  ..$ confusion: num [1:4, 1:5] 27 6 10 4 6 24 1 8 11 2 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:4] "01" "02" "03" "04"
  .. .. ..$ : chr [1:5] "01" "02" "03" "04" ...
  ..$ votes    : matrix [1:188, 1:4] 0.94 0.354 0.532 0.543 0.525 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:188] "1410" "86" "2307" "1834" ...
  .. .. ..$ : chr [1:4] "01" "02" "03" "04"
  .. ..- attr(*, "class")= chr [1:2] "matrix" "votes"
  ..$ proximity: NULL
 $ inbag          : NULL
 $ terms          :Classes 'terms', 'formula'  language Model ~ Pylo_diversity_is_sum_of_BL + average_phylogenetic_diversity_is_mean_of_BL +      variance_Pylo_diversity_is_variance_of_BL + F_quadratic_entropy_is_sum_of_PD +  ...
  .. ..- attr(*, "variables")= language list(Model, Pylo_diversity_is_sum_of_BL, average_phylogenetic_diversity_is_mean_of_BL,      variance_Pylo_diversity_is_variance_of_BL, F_quadratic_entropy_is_sum_of_PD,  ...
  .. ..- attr(*, "factors")= int [1:21, 1:20] 0 1 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. ..$ : chr [1:21] "Model" "Pylo_diversity_is_sum_of_BL" "average_phylogenetic_diversity_is_mean_of_BL" "variance_Pylo_diversity_is_variance_of_BL" ...
  .. .. .. ..$ : chr [1:20] "Pylo_diversity_is_sum_of_BL" "average_phylogenetic_diversity_is_mean_of_BL" "variance_Pylo_diversity_is_variance_of_BL" "F_quadratic_entropy_is_sum_of_PD" ...
  .. ..- attr(*, "term.labels")= chr [1:20] "Pylo_diversity_is_sum_of_BL" "average_phylogenetic_diversity_is_mean_of_BL" "variance_Pylo_diversity_is_variance_of_BL" "F_quadratic_entropy_is_sum_of_PD" ...
  .. ..- attr(*, "order")= int [1:20] 1 1 1 1 1 1 1 1 1 1 ...
  .. ..- attr(*, "intercept")= num 0
  .. ..- attr(*, "response")= int 1
  .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
  .. ..- attr(*, "predvars")= language list(Model, Pylo_diversity_is_sum_of_BL, average_phylogenetic_diversity_is_mean_of_BL,      variance_Pylo_diversity_is_variance_of_BL, F_quadratic_entropy_is_sum_of_PD,  ...
  .. ..- attr(*, "dataClasses")= Named chr [1:21] "factor" "numeric" "numeric" "numeric" ...
  .. .. ..- attr(*, "names")= chr [1:21] "Model" "Pylo_diversity_is_sum_of_BL" "average_phylogenetic_diversity_is_mean_of_BL" "variance_Pylo_diversity_is_variance_of_BL" ...
 - attr(*, "class")= chr [1:2] "randomForest.formula" "randomForest"
LS0tCnRpdGxlOiAiRC1wbGFjZSBGQVJNIGRvY3VtZW50YXRpb246IE1vZHVsZSAzIgphdXRob3I6ICJUeSBUdWZmLCBCcnVubyBWaWxlbGEsIGFuZCBDYXJsb3MgQm90ZXJvIgpkYXRlOiAncHJvamVjdCBiZWdhbjogMTUgTWF5IDIwMTYsIGRvY3VtZW50IHVwZGF0ZWQ6IGByIHN0cmZ0aW1lKFN5cy50aW1lKCksIGZvcm1hdAogID0gIiVkICVCICVZIilgJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CmJpYmxpb2dyYXBoeTogRkFSTSBwYWNrYWdlLmJpYgotLS0KYGBge3J9CmxpYnJhcnkocG5nKQpgYGAKCgoKYGBge3J9CiMjIEZpcnN0IGNvbnNvbGlkYXRlIHRoZSBhdmFpbGFibGUgZmlsZXMgaW50byBhIHNpbmdsZSB0YWJsZQogICAgCiAgICAgIHBhdGggPC0gIn4vQm94IFN5bmMvRm91ciBtb2RlbCBjb21wYXJlL01vZHVsZSAyIgogICAgICAgICAgIAogICAgIAogICAgICAgICAgIHNldHdkKHBhdGgpCiAgICBteWZpbGVzX2Z1bGwgPC0gbGlzdC5kaXJzKCkKICAgIGFuYWx5emVfdGhpc19tYW55IDwtIGxlbmd0aChteWZpbGVzX2Z1bGwpCiAgICAKICAgIGF2YWlsYWJsZV9maWxlcyA8LSBtYXRyaXgoTkEsIDEsIDEpCiAgICAKICAgICAgICAKICAgIGZvcihpIGluIDE6IGFuYWx5emVfdGhpc19tYW55KXsKICAgIGF2YWlsYWJsZV9maWxlcyA8LSByYmluZChhdmFpbGFibGVfZmlsZXMgLCBhcy5tYXRyaXgobGlzdC5maWxlcyhteWZpbGVzX2Z1bGxbaV0sIGZ1bGwubmFtZXMgPSBUUlVFKSkpCiAgICB9CiAgICBkaW0oYXZhaWxhYmxlX2ZpbGVzKQogICAgCiAgICBzcGxpdC5maWxlLm5hbWUgPC0gc3Ryc3BsaXQoYXZhaWxhYmxlX2ZpbGVzWzEwXSwgc3BsaXQgPSAiXyIpIAogICAgCiAgICAKICAgIAogCmF2YWlsYWJsZSA8LSBsaXN0LmZpbGVzKCkKZmlsZXMgPC0gbWF0cml4KHJlcChOQSwgNjIpLCBsZW5ndGgoYXZhaWxhYmxlKSwgNjIpCmRpbShmaWxlcykKaSA8LSAxMAoKCmZvcihpIGluIDE6bGVuZ3RoKGF2YWlsYWJsZSkpewpsb2FkKGF2YWlsYWJsZVtpXSkKbmFtZSA8LSB1bmxpc3Qoc3Ryc3BsaXQoYXZhaWxhYmxlW2ldLCBzcGxpdD0iXyIpKQpmaWxlc1tpLF0gPC0gYyhhcy52ZWN0b3IobWF0cml4KG5hbWUsIDEsMzUpKSxtYXRyaXgoU2ltX3N0YXRpc3RpY3NbWzFdXSwgMSwgMjcpKQoKfQoKCmNvbG5hbWVzKGZpbGVzKSA8LSAgYygKCglOQSwKCSJiYWNrZ3JvdW5kX3Rha2VvdmVyX3R5cGUiICwKCU5BLAoJInJlcGxpY2F0ZSIsCglOQSwKCSJNb2RlbF90eXBlIiwKCXJlcChOQSwyKSwKCSJzcGVjaWF0aW9uX29mX0Vudl9Ob25EIiwKCSJzcGVjaWF0aW9uX29mX0Vudl9EIiwKCSJzcGVjaWF0aW9uX29mX0ZvciIsCgkic3BlY2lhdGlvbl9vZl9Eb20iLAoJTkEsCgkiZXh0aW5jdGlvbl9vZl9FbnZfTm9uRCIsCgkiZXh0aW5jdGlvbl9vZl9FbnZfRCIsCgkiZXh0aW5jdGlvbl9vZl9Gb3IiLAoJImV4dGluY3Rpb25fb2ZfRG9tIiwKCU5BLAoJIlAuZGlmZnVzaW9uX1RhcmdldF9mb3JhZ2VyIiwKCSJQLmRpZmZ1c2lvbl9UYXJnZXRfZG9tZXN0aWNhdG9yIiwKCSJQLmRpZmZ1c2lvbl9Tb3VyY2VfZm9yYWdlciIsCgkiUC5kaWZmdXNpb25fU291cmNlX2RvbWVzdGljYXRvciIsCglOQSwKCSJQLnRha2VvdmVyX1RhcmdldF9mb3JhZ2VyIiwKCSJQLnRha2VvdmVyX1RhcmdldF9kb21lc3RpY2F0b3IiLAoJIlAudGFrZW92ZXJfU291cmNlX2ZvcmFnZXIiLAoJIlAudGFrZW92ZXJfU291cmNlX2RvbWVzdGljYXRvciIsCglOQSwKCSJhcmlzYWxfb2ZfRW52X05vbkQiLAoJImFyaXNhbF9vZl9FbnZfRCIsCgkiYXJpc2FsX29mX0ZvciIsCgkiYXJpc2FsX29mX0RvbSIsCgkKCU5BLCAKCSJ0aW1lc3RlcHMiLCAKCU5BLAogICAgICAgIAogICAgIm51bWJlcl9vZl9icmFuY2hlcyIsCgkiUHlsb19kaXZlcnNpdHlfaXNfc3VtX29mX0JMIiwKCSJhdmVyYWdlX3BoeWxvZ2VuZXRpY19kaXZlcnNpdHlfaXNfbWVhbl9vZl9CTCIsCgkidmFyaWFuY2VfUHlsb19kaXZlcnNpdHlfaXNfdmFyaWFuY2Vfb2ZfQkwiLAoKCSJGX3F1YWRyYXRpY19lbnRyb3B5X2lzX3N1bV9vZl9QRCIsCgkiTWVhbl9wYWlyd2lzZV9kaXN0YW5jZSIsCgkidmFyaWFuY2VfcGFpcndpc2VfZGlzdGFuY2UiLAoKCSJFdm9sdXRpb25hcnlfZGlzdGluY3RpdmVuZXNzX3N1bSIsCgkibWVhbl9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIiwKCSJ2YXJpYW5jZV9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIiwKCgkiZ2FtbWEiLAoJImdhbW1hX3BfdmFsdWUiLAoJInNwZWNpYXRpb25fcmF0ZSIsCgkiZXh0aW5jdGlvbl9yYXRlIiwKCSJleHRpbmN0aW9uX3Blcl9zcGVjaWF0aW9uIiwKCSJzcGVjaWF0aW9uX21pbnVzX2V4dGluY3Rpb24iLAoJInRyYWl0XzFfc3BlY2lhdGlvbiIsCiAgCSJ0cmFpdF8yX3NwZWNpYXRpb24iICwKICAJInRyYWl0XzFfZXh0aW5jdGlvbiIgLAogIAkidHJhaXRfMl9leHRpbmN0aW9uIiAsCiAgCSJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMV90b18yIiAsCiAgCSJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMl90b18xIiAsCiAgCSJ0cmFuc2l0aW9uX3JhdGVfcmF0aW9fMXRvMl9vdmVyXzJ0bzEiICwKICAJIlBoeWxvZ2VuZXRpY19zaWduYWwiLAogIAkic3BhdGlhbC50ZXN0cy5mb3JhIiwKICAJInNwYXRpYWwudGVzdHMuZG9tIiwKICAJInByZXZhbGVuY2UiCiAgCQogICAgCiAgKQoKcmVzdWx0c190YWJsZSA8LSBhcy5kYXRhLmZyYW1lKGZpbGVzKQpoZWFkKHJlc3VsdHNfdGFibGUpCmRpbShyZXN1bHRzX3RhYmxlKQpDb25jYXRlbmF0ZWRfZGF0YSA8LSByZXN1bHRzX3RhYmxlCnNhdmUoQ29uY2F0ZW5hdGVkX2RhdGEsIGZpbGU9In4vRGVza3RvcC9Gb3VyX21vZGVsX2NvbXBhcmVfcmVzdWx0cy5SZGF0YSIpCgpvbmUgPC0gc3Vic2V0KHJlc3VsdHNfdGFibGUsIE1vZGVsX3R5cGU9PSIwMSIgKQp0d28gPC0gc3Vic2V0KHJlc3VsdHNfdGFibGUsIE1vZGVsX3R5cGU9PSIwMiIgKQp0aHJlZSA8LSBzdWJzZXQocmVzdWx0c190YWJsZSwgTW9kZWxfdHlwZT09IjAzIiApCmZvdXIgPC0gc3Vic2V0KHJlc3VsdHNfdGFibGUsIE1vZGVsX3R5cGU9PSIwNCIgKQpjcm9wIDwtIG1pbihsZW5ndGgob25lWywxXSksCmxlbmd0aCh0d29bLDFdKSwKbGVuZ3RoKHRocmVlWywxXSksCmxlbmd0aChmb3VyWywxXSkpCm9uZSA8LSBvbmVbMTpjcm9wLF0KdHdvIDwtIHR3b1sxOmNyb3AsXQp0aHJlZSA8LSB0aHJlZVsxOmNyb3AsXQpmb3VyIDwtIGZvdXJbMTpjcm9wLF0KCkNvbmNhdGVuYXRlZF9kYXRhIDwtIHJiaW5kKG9uZSwgdHdvLCB0aHJlZSwgZm91cikKZGltKENvbmNhdGVuYXRlZF9kYXRhKQoKCgoKCnNhdmUoQ29uY2F0ZW5hdGVkX2RhdGEsIGZpbGU9cGFzdGUwKCJ+L0JveCBTeW5jL2NvbGxpZGluZyByYW5nZXMvU2ltdWxhdGlvbnNfaHVtYW5zL1Jlc3VsdHMvYXZhaWxhYmxlIGRhaWx5IHN1bW1hcmllcy9Gb3VyX21vZGVsX2NvbXBhcmVfcmVzdWx0cyIsIGZvcm1hdChTeXMudGltZSgpLCBmb3JtYXQ9IiVkXyViXyVZIiksIl9jcm9wX3RvXyIsIGNyb3AsIi5SZGF0YSIpKQpjcm9wCgpgYGAKCgoKCmBgYHtyfQojIyBGaXJzdCBjb25zb2xpZGF0ZSB0aGUgYXZhaWxhYmxlIGZpbGVzIGludG8gYSBzaW5nbGUgdGFibGUKICAgIAogICAgICBwYXRoIDwtICJ+L0JveCBTeW5jL0ZvdXIgbW9kZWwgY29tcGFyZS9Nb2R1bGUgMiBleHRpbmN0IgogICAgICAgICAgIAogICAgIAogICAgICAgICAgIHNldHdkKHBhdGgpCiAgICBteWZpbGVzX2Z1bGwgPC0gbGlzdC5kaXJzKCkKICAgIGFuYWx5emVfdGhpc19tYW55IDwtIGxlbmd0aChteWZpbGVzX2Z1bGwpCiAgICAKICAgIGF2YWlsYWJsZV9maWxlcyA8LSBtYXRyaXgoTkEsIDEsIDEpCiAgICAKICAgICAgICAKICAgIGZvcihpIGluIDE6IGFuYWx5emVfdGhpc19tYW55KXsKICAgIGF2YWlsYWJsZV9maWxlcyA8LSByYmluZChhdmFpbGFibGVfZmlsZXMgLCBhcy5tYXRyaXgobGlzdC5maWxlcyhteWZpbGVzX2Z1bGxbaV0sIGZ1bGwubmFtZXMgPSBUUlVFKSkpCiAgICB9CiAgICBkaW0oYXZhaWxhYmxlX2ZpbGVzKQogICAgCiAgICBzcGxpdC5maWxlLm5hbWUgPC0gc3Ryc3BsaXQoYXZhaWxhYmxlX2ZpbGVzWzEwXSwgc3BsaXQgPSAiXyIpIAogICAgCiAgICAKICAgIAogCmF2YWlsYWJsZSA8LSBsaXN0LmZpbGVzKCkKZmlsZXMgPC0gbWF0cml4KHJlcChOQSwgNjIpLCBsZW5ndGgoYXZhaWxhYmxlKSwgNjIpCmRpbShmaWxlcykKaSA8LSAxMAoKCmZvcihpIGluIDE6bGVuZ3RoKGF2YWlsYWJsZSkpewpsb2FkKGF2YWlsYWJsZVtpXSkKbmFtZSA8LSB1bmxpc3Qoc3Ryc3BsaXQoYXZhaWxhYmxlW2ldLCBzcGxpdD0iXyIpKQpmaWxlc1tpLF0gPC0gYyhhcy52ZWN0b3IobWF0cml4KG5hbWUsIDEsMzUpKSxtYXRyaXgoU2ltX3N0YXRpc3RpY3NbWzFdXSwgMSwgMjcpKQoKfQoKCmNvbG5hbWVzKGZpbGVzKSA8LSAgYygKCglOQSwKCSJiYWNrZ3JvdW5kX3Rha2VvdmVyX3R5cGUiICwKCU5BLAoJInJlcGxpY2F0ZSIsCglOQSwKCSJNb2RlbF90eXBlIiwKCXJlcChOQSwyKSwKCSJzcGVjaWF0aW9uX29mX0Vudl9Ob25EIiwKCSJzcGVjaWF0aW9uX29mX0Vudl9EIiwKCSJzcGVjaWF0aW9uX29mX0ZvciIsCgkic3BlY2lhdGlvbl9vZl9Eb20iLAoJTkEsCgkiZXh0aW5jdGlvbl9vZl9FbnZfTm9uRCIsCgkiZXh0aW5jdGlvbl9vZl9FbnZfRCIsCgkiZXh0aW5jdGlvbl9vZl9Gb3IiLAoJImV4dGluY3Rpb25fb2ZfRG9tIiwKCU5BLAoJIlAuZGlmZnVzaW9uX1RhcmdldF9mb3JhZ2VyIiwKCSJQLmRpZmZ1c2lvbl9UYXJnZXRfZG9tZXN0aWNhdG9yIiwKCSJQLmRpZmZ1c2lvbl9Tb3VyY2VfZm9yYWdlciIsCgkiUC5kaWZmdXNpb25fU291cmNlX2RvbWVzdGljYXRvciIsCglOQSwKCSJQLnRha2VvdmVyX1RhcmdldF9mb3JhZ2VyIiwKCSJQLnRha2VvdmVyX1RhcmdldF9kb21lc3RpY2F0b3IiLAoJIlAudGFrZW92ZXJfU291cmNlX2ZvcmFnZXIiLAoJIlAudGFrZW92ZXJfU291cmNlX2RvbWVzdGljYXRvciIsCglOQSwKCSJhcmlzYWxfb2ZfRW52X05vbkQiLAoJImFyaXNhbF9vZl9FbnZfRCIsCgkiYXJpc2FsX29mX0ZvciIsCgkiYXJpc2FsX29mX0RvbSIsCgkKCU5BLCAKCSJ0aW1lc3RlcHMiLCAKCU5BLAogICAgICAgIAogICAgIm51bWJlcl9vZl9icmFuY2hlcyIsCgkiUHlsb19kaXZlcnNpdHlfaXNfc3VtX29mX0JMIiwKCSJhdmVyYWdlX3BoeWxvZ2VuZXRpY19kaXZlcnNpdHlfaXNfbWVhbl9vZl9CTCIsCgkidmFyaWFuY2VfUHlsb19kaXZlcnNpdHlfaXNfdmFyaWFuY2Vfb2ZfQkwiLAoKCSJGX3F1YWRyYXRpY19lbnRyb3B5X2lzX3N1bV9vZl9QRCIsCgkiTWVhbl9wYWlyd2lzZV9kaXN0YW5jZSIsCgkidmFyaWFuY2VfcGFpcndpc2VfZGlzdGFuY2UiLAoKCSJFdm9sdXRpb25hcnlfZGlzdGluY3RpdmVuZXNzX3N1bSIsCgkibWVhbl9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIiwKCSJ2YXJpYW5jZV9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIiwKCgkiZ2FtbWEiLAoJImdhbW1hX3BfdmFsdWUiLAoJInNwZWNpYXRpb25fcmF0ZSIsCgkiZXh0aW5jdGlvbl9yYXRlIiwKCSJleHRpbmN0aW9uX3Blcl9zcGVjaWF0aW9uIiwKCSJzcGVjaWF0aW9uX21pbnVzX2V4dGluY3Rpb24iLAoJInRyYWl0XzFfc3BlY2lhdGlvbiIsCiAgCSJ0cmFpdF8yX3NwZWNpYXRpb24iICwKICAJInRyYWl0XzFfZXh0aW5jdGlvbiIgLAogIAkidHJhaXRfMl9leHRpbmN0aW9uIiAsCiAgCSJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMV90b18yIiAsCiAgCSJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMl90b18xIiAsCiAgCSJ0cmFuc2l0aW9uX3JhdGVfcmF0aW9fMXRvMl9vdmVyXzJ0bzEiICwKICAJIlBoeWxvZ2VuZXRpY19zaWduYWwiLAogIAkic3BhdGlhbC50ZXN0cy5mb3JhIiwKICAJInNwYXRpYWwudGVzdHMuZG9tIiwKICAJInByZXZhbGVuY2UiCiAgCQogICAgCiAgKQoKQ29uY2F0ZW5hdGVkX2RhdGEgPC0gYXMuZGF0YS5mcmFtZShmaWxlcykKaGVhZChDb25jYXRlbmF0ZWRfZGF0YSkKZGltKENvbmNhdGVuYXRlZF9kYXRhKQoKc2F2ZShDb25jYXRlbmF0ZWRfZGF0YSwgZmlsZT1wYXN0ZTAoIn4vQm94IFN5bmMvY29sbGlkaW5nIHJhbmdlcy9TaW11bGF0aW9uc19odW1hbnMvUmVzdWx0cy9hdmFpbGFibGUgZGFpbHkgc3VtbWFyaWVzL0ZvdXJfbW9kZWxfY29tcGFyZV9yZXN1bHRzX2V4dGluY3RfIiwgZm9ybWF0KFN5cy50aW1lKCksIGZvcm1hdD0iJWRfJWJfJVkiKSwiX2Nyb3BfdG9fIiwgY3JvcCwiLlJkYXRhIikpCgpgYGAKCgpgYGB7cn0Kc2V0d2QoIn4vQm94IFN5bmMvY29sbGlkaW5nIHJhbmdlcy9TaW11bGF0aW9uc19odW1hbnMvUmVzdWx0cy9hdmFpbGFibGUgZGFpbHkgc3VtbWFyaWVzIikKZGV0YWlscyA8LSBmaWxlLmluZm8obGlzdC5maWxlcygpKQoKdHJpbW1lZF9kZXRhaWxzIDwtIGRldGFpbHNbd2hpY2gobGlzdC5maWxlcygpID09IGxpc3QuZmlsZXMocGF0dGVybiA9ICJGb3VyX21vZGVsX2NvbXBhcmVfcmVzdWx0c19leHRpbmN0KiIpKSxdCm9yZCA8LSBvcmRlcih0cmltbWVkX2RldGFpbHMkbXRpbWUsIGRlY3JlYXNpbmcgPSBUUlVFKQpyb3duYW1lcyh0cmltbWVkX2RldGFpbHNbb3JkLF0pWzFdCmxvYWQocm93bmFtZXModHJpbW1lZF9kZXRhaWxzW29yZCxdKVsxXSkKZXh0aW5jdCA8LSBDb25jYXRlbmF0ZWRfZGF0YQoKdHJpbW1lZF9kZXRhaWxzIDwtIGRldGFpbHNbd2hpY2gobGlzdC5maWxlcygpICE9IGxpc3QuZmlsZXMocGF0dGVybiA9ICJGb3VyX21vZGVsX2NvbXBhcmVfcmVzdWx0c19leHRpbmN0KiIpKSxdCm9yZCA8LSBvcmRlcih0cmltbWVkX2RldGFpbHMkbXRpbWUsIGRlY3JlYXNpbmcgPSBUUlVFKQpyb3duYW1lcyh0cmltbWVkX2RldGFpbHNbb3JkLF0pWzFdCmxvYWQocm93bmFtZXModHJpbW1lZF9kZXRhaWxzW29yZCxdKVsxXSkKZXh0YW50IDwtIENvbmNhdGVuYXRlZF9kYXRhCgoKCgoKYGBgCgoKCgoKYGBge3J9Cgpmb3IoaSBpbiBjKDksMTAsMTEsMTIsMTQsMTUsMTYsMTcsMTksMjAsMjEsMjIsMjQsMjUsMjYsMjcsMjksMzAsMzEsMzIpKXsKCWV4dGluY3Rbd2hpY2goaXMubmFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCBpXSkpKSA9PSBUUlVFKSwgaV0gPC0gTkEKfQoKZm9yKGkgaW4gYyg5LDEwLDExLDEyLDE0LDE1LDE2LDE3LDE5LDIwLDIxLDIyLDI0LDI1LDI2LDI3LDI5LDMwLDMxLDMyKSl7CglleHRhbnRbd2hpY2goaXMubmFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIGldKSkpID09IFRSVUUpLCBpXSA8LSBOQQp9CgppIDwtIDE5CmZvcihpIGluIGMoMjAsMjEsMjQsMjUsMjYsMjcpKXsKCWV4dGluY3Rbd2hpY2goYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIGldKSkgPT0gMCksIGldIDwtIE5BCn0KCmZvcihpIGluIGMoMjAsMjEsMjQsMjUsMjYsMjcpKXsKCWV4dGFudFt3aGljaChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCBpXSkpID09IDApLCBpXSA8LSBOQQp9CgoKeGxpbWl0IDwtIGMoMCwxKQp5bGltaXQgPC0gYygwLDYwMCkKbWFpbmNleCA8LSAwLjkKCnBuZyhmaWxlPSJHbG9iYWxfc3VjY2Vzc19yYXRlX3Blcl9wYXJhbWV0ZXIucG5nIiwgd2lkdGg9OC41LCBoZWlnaHQ9MTEsIHVuaXRzPSJpbiIsIHJlcz0zMDApCgpwYXIobWZyb3c9Yyg1LDQpLCBtYXI9YygzLDMsMywwKSkKCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLDldKSksIG1haW49InNwZWNpYXRpb24gb2YgRiBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9MC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50Wyw5XSkpLCBtYWluPSJzcGVjaWF0aW9uIG9mIEYgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9MC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssMTBdKSksIG1haW49InNwZWNpYXRpb24gb2YgRCBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssMTBdKSksIG1haW49InNwZWNpYXRpb24gb2YgRCBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssMTFdKSksIG1haW49InNwZWNpYXRpb24gb2YgRiBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssMTFdKSksIG1haW49InNwZWNpYXRpb24gb2YgRiBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywxMl0pKSwgbWFpbj0ic3BlY2lhdGlvbiBvZiBEIGluIEQgZW52IiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywxMl0pKSwgbWFpbj0ic3BlY2lhdGlvbiBvZiBEIGluIEQgZW52IiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgojIyMjIyMjCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAxNF0pKSwgbWFpbj0iZXh0aW5jdGlvbiBvZiBGIGluIEYgZW52IiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMTRdKSksIG1haW49ImV4dGluY3Rpb24gb2YgRiBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAxNV0pKSwgbWFpbj0iZXh0aW5jdGlvbiBvZiBEIGluIEYgZW52IiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMTVdKSksIG1haW49ImV4dGluY3Rpb24gb2YgRCBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgMTZdKSksIG1haW49ImV4dGluY3Rpb24gb2YgRiBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDE2XSkpLCBtYWluPSJleHRpbmN0aW9uIG9mIEYgaW4gRCBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDE3XSkpLCBtYWluPSJleHRpbmN0aW9uIG9mIEQgaW4gRCBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAxN10pKSwgbWFpbj0iZXh0aW5jdGlvbiBvZiBEIGluIEQgZW52IiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgojIyMjIyMKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDI5XSkpLCBtYWluPSJhcmlzYWwgb2YgRiBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDI5XSkpLCBtYWluPSJhcmlzYWwgb2YgRiBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAzMF0pKSwgbWFpbj0iYXJpc2FsIG9mIEQgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAzMF0pKSwgbWFpbj0iYXJpc2FsIG9mIEQgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDMxXSkpLCBtYWluPSJhcmlzYWwgb2YgRiBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDMxXSkpLCBtYWluPSJhcmlzYWwgb2YgRiBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgMzJdKSksIG1haW49ImFyaXNhbCBvZiBEIGluIEQgZW52IiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMzJdKSksIG1haW49ImFyaXNhbCBvZiBEIGluIEQgZW52IiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgojIyMjIyMKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDE5XSkpLCBtYWluPSJOT1BFIC0tIERpZmZ1c2lvbjogc291cmNlIEYsIHRhcmdldCBGIiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IGMoMCwxODAwMCksIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDE5XSkpLCBtYWluPSJOT1BFIC0tIERpZmZ1c2lvbjogc291cmNlIEYsIHRhcmdldCBGIiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0gYygwLDE4MDAwKSwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAyMF0pKSwgbWFpbj0iRGlmZnVzaW9uOiBzb3VyY2UgRCwgdGFyZ2V0IEYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAyMF0pKSwgbWFpbj0iRGlmZnVzaW9uOiBzb3VyY2UgRCwgdGFyZ2V0IEYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDIxXSkpLCBtYWluPSJEaWZmdXNpb246IHNvdXJjZSBGLCB0YXJnZXQgRCIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDIxXSkpLCBtYWluPSJEaWZmdXNpb246IHNvdXJjZSBGLCB0YXJnZXQgRCIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgMjJdKSksIG1haW49Ik5PUEUgLS0gRGlmZnVzaW9uOiBzb3VyY2UgRCwgdGFyZ2V0IEQiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0gYygwLDE4MDAwKSwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMjJdKSksIG1haW49Ik5PUEUgLS0gRGlmZnVzaW9uOiBzb3VyY2UgRCwgdGFyZ2V0IEQiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSBjKDAsMTgwMDApLCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgojIyMjCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAyNF0pKSwgbWFpbj0iVGFrZW92ZXI6IHNvdXJjZSBGLCB0YXJnZXQgRiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDI0XSkpLCBtYWluPSJUYWtlb3Zlcjogc291cmNlIEYsIHRhcmdldCBGIiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgoKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDI1XSkpLCBtYWluPSJUYWtlb3Zlcjogc291cmNlIEQsIHRhcmdldCBGIiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMjVdKSksIG1haW49IlRha2VvdmVyOiBzb3VyY2UgRCwgdGFyZ2V0IEYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDI2XSkpLCBtYWluPSJUYWtlb3Zlcjogc291cmNlIEYsIHRhcmdldCBEIiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMjZdKSksIG1haW49IlRha2VvdmVyOiBzb3VyY2UgRiwgdGFyZ2V0IEQiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDI3XSkpLCBtYWluPSJUYWtlb3Zlcjogc291cmNlIEQsIHRhcmdldCBEIiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMjddKSksIG1haW49IlRha2VvdmVyOiBzb3VyY2UgRCwgdGFyZ2V0IEQiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCgpkZXYub2ZmKCkKCgoKCgoKYGBgCgoKIVtdKEdsb2JhbF9zdWNjZXNzX3JhdGVfcGVyX3BhcmFtZXRlci5wbmcpCgoKYGBge3J9CgoKCnBuZyhmaWxlPSJleHRpY3Rpb24gbWludXMgZXh0YW50IHBlciBvdXRjb21lLnBuZyIsIHdpZHRoPTguNSwgaGVpZ2h0PTExLCB1bml0cz0iaW4iLCByZXM9MzAwKQpwYXIobWZyb3c9YygzLDEpKQoKcGxvdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0Wyw5XSkpLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywxNF0pKSwgeGxhYj0ic3BlY2lhdGlvbiIsIHlsYWI9ImV4dGluY3Rpb24iLCBjb2w9IGFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0wLjIpLCBwY2g9MTksIGNleD0wLjYsIHlsaW09YygwLDEpKQpwbG90KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssOV0pKSwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywxNF0pKSwgeGxhYj0ic3BlY2lhdGlvbiIsIHlsYWI9ImV4dGluY3Rpb24iLCBjb2w9IGFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPTAuMiksIHBjaD0xOSwgY2V4PTAuNiwgeWxpbT1jKDAsMSkpCgpwbG90KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLDldKSksIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLDE0XSkpLCB4bGFiPSJzcGVjaWF0aW9uIiwgeWxhYj0iZXh0aW5jdGlvbiIsIGNvbD0gYWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPTAuMiksIHBjaD0xOSwgY2V4PTAuNiwgeWxpbT1jKDAsMSkpCnBvaW50cyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLDldKSksIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssMTRdKSksIHhsYWI9InNwZWNpYXRpb24iLCB5bGFiPSJleHRpbmN0aW9uIiwgY29sPSBhZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0wLjIpLCBwY2g9MTksIGNleD0wLjYpCgoKZGV2Lm9mZigpCgoKYGBgCgohW10oZXh0aWN0aW9uIG1pbnVzIGV4dGFudCBwZXIgb3V0Y29tZS5wbmcpCgoKCmBgYHtyfQoKCmxvYWQoJ34vQm94IFN5bmMvY29sbGlkaW5nIHJhbmdlcy9TaW11bGF0aW9uc19odW1hbnMvQXZhaWxhYmxlIHRyZWVzL3JlYWwuYW5hbHlzaXMuUkRhdGEnKQoKCgojQ29uY2F0ZW5hdGVkX2RhdGEgPC0gQ29uY2F0ZW5hdGVkX2RhdGFbQ29uY2F0ZW5hdGVkX2RhdGFbLCAyXSA9PSAic3RhdHMubm8uYlRPIiwgXQojQ29uY2F0ZW5hdGVkX2RhdGEgPC0gQ29uY2F0ZW5hdGVkX2RhdGFbQ29uY2F0ZW5hdGVkX2RhdGFbLCA2XSAhPSAiMDUiLCBdCiMgQ29uY2F0ZW5hdGVkX2RhdGFbLCA2XSA8LSBhcy5udW1lcmljKENvbmNhdGVuYXRlZF9kYXRhWywgNl0pCiMgIyBDb25jYXRlbmF0ZWRfZGF0YVtvcmlnaW5hbFssIDJdID09ICJiYWNrZ3JvdW5kX3Rha2VvdmVyIiwgNl0gPC0gIENvbmNhdGVuYXRlZF9kYXRhW29yaWdpbmFsWywgMl0gPT0gImJhY2tncm91bmRfdGFrZW92ZXIiLCA2XSArIDQKQ29uY2F0ZW5hdGVkX2RhdGFbLCA2XSA8LSBmYWN0b3IoQ29uY2F0ZW5hdGVkX2RhdGFbLCA2XSkKI2hlYWQoQ29uY2F0ZW5hdGVkX2RhdGEpCiNuYW1lcyhDb25jYXRlbmF0ZWRfZGF0YSkKClBDQWRhdGEgPC0gQ29uY2F0ZW5hdGVkX2RhdGFbLCAtKDE6MzUpXQpQQ0FkYXRhIDwtIFBDQWRhdGFbLCAtMTJdClBDQWRhdGEgPC0gYXBwbHkoUENBZGF0YSwgMiwgYXMubnVtZXJpYykKcmVtb3ZlIDwtIGFwcGx5KGlzLm5hKFBDQWRhdGEpLCAxLCBhbnkpClBDQWRhdGEgPC0gUENBZGF0YVshcmVtb3ZlLCBdCgojIFByZWRpY3Rpb25zCmxpYnJhcnkocmFuZG9tRm9yZXN0KQoKZGF0YS5hbmFseXNpcy5jb21wMiA8LSBkYXRhLmZyYW1lKCJNb2RlbCIgPSBhcy5mYWN0b3IoQ29uY2F0ZW5hdGVkX2RhdGFbIXJlbW92ZSwgNl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENBZGF0YSkKZGF0YS5hbmFseXNpcy5jb21wMiRzcHJhdGUgPC0gZGF0YS5hbmFseXNpcy5jb21wMiR0cmFpdF8xX3NwZWNpYXRpb24vZGF0YS5hbmFseXNpcy5jb21wMiR0cmFpdF8yX3NwZWNpYXRpb24KZGF0YS5hbmFseXNpcy5jb21wMiRleHRyYXRlIDwtIGRhdGEuYW5hbHlzaXMuY29tcDIkdHJhaXRfMV9leHRpbmN0aW9uL2RhdGEuYW5hbHlzaXMuY29tcDIkdHJhaXRfMl9leHRpbmN0aW9uCgoKI2xvYWQoIlJlYWxfcGh5L3JlYWwuYW5hbHlzaXMuUkRhdGEiKQphIDwtIGFzLmRhdGEuZnJhbWUocmVhbC5hbmFseXNpcyRyZXN1bHRzX3N1bW1hcnlfb2Zfc2luZ2xlX3ZhbHVlX291dHB1dHMpCmEkc3ByYXRlIDwtIGEkdHJhaXRfMV9zcGVjaWF0aW9uIC8gYSR0cmFpdF8yX3NwZWNpYXRpb24KYSRleHRyYXRlIDwtIGEkdHJhaXRfMV9leHRpbmN0aW9uIC8gYSR0cmFpdF8yX2V4dGluY3Rpb24KCmRhdGEuYW5hbHlzaXMuY29tcDMgPC0gZGF0YS5hbmFseXNpcy5jb21wMlssIC1jKDIsIDEzOjE0LCAxNjoyMCldCiNkYXRhLmFuYWx5c2lzLmNvbXAzIDwtIGRhdGEuYW5hbHlzaXMuY29tcDNbZGF0YS5hbmFseXNpcy5jb21wMyRNb2RlbCAlaW4lIDE6NCwgXQojZGF0YS5hbmFseXNpcy5jb21wMyRNb2RlbCA8LSBmYWN0b3IoZGF0YS5hbmFseXNpcy5jb21wMyRNb2RlbCkKI3N1YiA8LSB1bmxpc3QobGFwcGx5KGFzLmxpc3QoYygxOjQpKSwgZnVuY3Rpb24oeCwgeSkgewojICBzYW1wbGUod2hpY2goeSRNb2RlbCA9PSB4KSwgbWluKHRhYmxlKGRhdGEuYW5hbHlzaXMuY29tcDMkTW9kZWwpKSl9LAojICB5ID0gZGF0YS5hbmFseXNpcy5jb21wMykpCiMgZGF0YS5hbmFseXNpcy5jb21wMyA8LSBkYXRhLmFuYWx5c2lzLmNvbXAzW3N1YiwgXQpmdW4gPC0gZnVuY3Rpb24oeCwgeSwgcGVyID0gLjMzKSB7c2FtcGxlKHdoaWNoKHkkTW9kZWwgPT0geCksIHJvdW5kKHRhYmxlKHkkTW9kZWwpWzFdKnBlcikpfQoKc3ViLnRlc3QgPC0gdW5saXN0KGxhcHBseShhcy5saXN0KHBhc3RlMCgwLCBjKDE6NCkpKSwgZnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkYXRhLmFuYWx5c2lzLmNvbXAzKSkKdGVzdDIgPC0gZGF0YS5hbmFseXNpcy5jb21wM1tzdWIudGVzdCwgMjpuY29sKGRhdGEuYW5hbHlzaXMuY29tcDMpXQp0ZXN0MSA8LSBkYXRhLmFuYWx5c2lzLmNvbXAzW3N1Yi50ZXN0LCAxXQp0cmFpbiA8LSBkYXRhLmFuYWx5c2lzLmNvbXAzWy1zdWIudGVzdCwgXQooZml0IDwtIHJhbmRvbUZvcmVzdChNb2RlbCB+IC4sIGRhdGE9dHJhaW4sIHh0ZXN0ID0gdGVzdDIsIHl0ZXN0ID0gdGVzdDEsIAogICAgICAgICAgICAgICAgICAgIGltcG9ydGFuY2U9VFJVRSwgbnRyZWU9MjQwMCwga2VlcC5mb3Jlc3QgPSBUUlVFLCByZXBsYWNlPVRSVUUsIG5vcm0udm90ZXM9RkFMU0UpKQoKcHJlZGljdGlvbnMgPC0gcHJlZGljdChmaXQsIAogICAgICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icHJvYiIpCgoKYGBgCgoKCgoKYGBge3J9CgpwbG90KGZpdCwgeWxpbT1jKDAsMSkpCgpgYGAKCgoKCmBgYHtyfQpsYWJzIDwtIGMoIkJhc2ljIiwgIitEaWZmdXNpb24iLCAiK1Rha2VvdmVyIiwgIitEaWZmdXNpb24gK1Rha2VvdmVyIikKCmBgYAoKCmBgYHtyfQojIGJhciBwbG90CnBuZygiUHJvYl9hdXMucG5nIiwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMjUsIHJlcyA9IDMwMCwgdW5pdHMgPSAiaW4iKQpwYXIobWFyID0gYyg4LCA4LCAxLCAxKSkKcHJlZCA8LSBzZXROYW1lcyhhcy5udW1lcmljKHByZWRpY3Rpb25zKSwgbGFicykKY29scyA8LSByZXYoYygiZGFya2dyZWVuIiwgInJlZCIsICJibHVlIiwgImRhcmtvcmFuZ2UxIikpCmJhcnBsb3QocHJlZCwgY29sID0gY29scywgeWxhYiA9ICJQcm9hYmlsaXR5IiwgY2V4LmxhYiA9IDMsIGNleC5uYW1lcyA9IDIpCmRldi5vZmYoKQpgYGAKCiFbXShQcm9iX2F1cy5wbmcpCgoKYGBge3J9CiMgUGxvdCBjb25mdXNpb24gbWF0cml4CnBuZygiQ29uZmZ1c2lvbl9tYXRyaXhfYWxsLnBuZyIsIHdpZHRoID0gMjUsIGhlaWdodCA9IDI1LCByZXM9MzAwLCB1bml0cz0iaW4iKQpwYXIobWFyID0gYygxMCwgMTEsIDEsIDEpKQpjb2xvcnMxIDwtIGNvbG9yUmFtcFBhbGV0dGUoY29sb3JzID0gYygiI2YwZjBmMCIsICIjYmRiZGJkIiwiIzYzNjM2MyIpKQpwcm9wIDwtIGFwcGx5KGZpdCRjb25mdXNpb25bLCAtNV0sIDIsIGZ1bmN0aW9uKHgpe3ggLyBzdW0oeCl9KSAqIDEwMAoKaW1hZ2UocHJvcCwgY29sID0gY29sb3JzMSgyMCksIGF4ZXM9RkFMU0UpCmF4aXMoMSwgYXQ9YygwLCAuMzMsIC42NiwgMSksIGxhYmVscz1sYWJzLCB0aWNrID0gRkFMU0UsIGxpbmUgPSBGQUxTRSwgY2V4LmF4aXMgPSAzLjUsIHBvcyA9IC0uMTkpCmF4aXMoMiwgYXQ9YygwLCAuMzMsIC42NiwgMSksIGxhYmVscz1sYWJzLCB0aWNrID0gRkFMU0UsIGxpbmUgPSBGQUxTRSwgY2V4LmF4aXMgPSAzLjUpCm10ZXh0KCJBQ1RVQUwiLCBzaWRlID0gMSwgcGFkaiA9IDMsIGNleCA9IDQpCm10ZXh0KCJQUkVESUNURUQiLCBzaWRlID0gMiwgcGFkaiA9IC0zLCBjZXggPSA0KQoKZm9yKGkgaW4gMTo0KSB7CiAgZm9yKGogaW4gMTo0KSB7CiAgICB0ZXh0KHggPSBjKDAsIC4zMywgLjY2LCAxKVtpXSwgeSA9IGMoMCwgLjMzLCAuNjYsIDEpW2pdLCBwYXN0ZTAocm91bmQocHJvcFtpLCBqXSwgMiksICIlIiksCiAgICAgICAgIGNleCA9IDUpCiAgfQp9CmRldi5vZmYoKQpgYGAKCgohW10oQ29uZmZ1c2lvbl9tYXRyaXhfYWxsLnBuZykKCgpgYGB7cn0KaW1wb3J0YW5jZShmaXQpCmBgYAoKCmBgYHtyfQojIFZhcmlhYmxlcyBpbXBvcnRhbmNlCgppbXAgPC0gaW1wb3J0YW5jZShmaXQpCmltcCA8LSBhcHBseShpbXAsIDIsIGZ1bmN0aW9uKHgpICh4IC0gbWluKHgpKS8obWF4KHgpIC0gbWluKHgpKSkKaW1wIDwtIGltcFtzb3J0KGltcFssIDVdLCBpbmRleC5yZXR1cm4gPSBUUlVFLCBkZWNyZWFzaW5nID0gVFJVRSkkaXgsIF0KCgpuYW1lcyA8LSByb3duYW1lcyhpbXApCm5hbWVzW25hbWVzID09ICJzcGF0aWFsLnRlc3RzLmZvcmEiXSA8LSAiU3BhY2UgRiIKbmFtZXNbbmFtZXMgPT0gInNwYXRpYWwudGVzdHMuZG9tIl0gPC0gIlNwYWNlIEQiCm5hbWVzW25hbWVzID09ICJzcHJhdGUiXSA8LSAiU3AocmF0aW8pIgpuYW1lc1tuYW1lcyA9PSAidHJhbnNpdGlvbl9mcm9tX3RyYWl0XzFfdG9fMiJdIDwtICJUUigxLTIpIgpuYW1lc1tuYW1lcyA9PSAidHJhbnNpdGlvbl9mcm9tX3RyYWl0XzJfdG9fMSJdIDwtICJUUigyLTEpIgpuYW1lc1tuYW1lcyA9PSAiUGh5bG9nZW5ldGljX3NpZ25hbCJdIDwtICJQaHlTaWcoRCkiCm5hbWVzW25hbWVzID09ICJFdm9sdXRpb25hcnlfZGlzdGluY3RpdmVuZXNzX3N1bSJdIDwtICJFRHN1bSIKbmFtZXNbbmFtZXMgPT0gIlB5bG9fZGl2ZXJzaXR5X2lzX3N1bV9vZl9CTCJdIDwtICJQRHN1bSIKbmFtZXNbbmFtZXMgPT0gInRyYW5zaXRpb25fcmF0ZV9yYXRpb18xdG8yX292ZXJfMnRvMSJdIDwtICJUUihyYXRpbykiCm5hbWVzW25hbWVzID09ICJnYW1tYSJdIDwtICJHYW1tYSIKbmFtZXNbbmFtZXMgPT0gIm1lYW5fUGh5bG9nZW5ldGljX2lzb2xhdGlvbiJdIDwtICJNUEkiCm5hbWVzW25hbWVzID09ICJleHRyYXRlIl0gPC0gIkV4dChyYXRpbykiCm5hbWVzW25hbWVzID09ICJhdmVyYWdlX3BoeWxvZ2VuZXRpY19kaXZlcnNpdHlfaXNfbWVhbl9vZl9CTCJdIDwtICJQRG1lYW4iCm5hbWVzW25hbWVzID09ICJleHRpbmN0aW9uX3Blcl9zcGVjaWF0aW9uIl0gPC0gIkRSIgpuYW1lc1tuYW1lcyA9PSAidmFyaWFuY2VfUGh5bG9nZW5ldGljX2lzb2xhdGlvbiJdIDwtICJWUEkiCm5hbWVzW25hbWVzID09ICJGX3F1YWRyYXRpY19lbnRyb3B5X2lzX3N1bV9vZl9QRCJdIDwtICJGIgpuYW1lc1tuYW1lcyA9PSAiTWVhbl9wYWlyd2lzZV9kaXN0YW5jZSJdIDwtICJNUEQiCm5hbWVzW25hbWVzID09ICJ2YXJpYW5jZV9QeWxvX2RpdmVyc2l0eV9pc192YXJpYW5jZV9vZl9CTCJdIDwtICJQRHZhciIKbmFtZXNbbmFtZXMgPT0gInZhcmlhbmNlX3BhaXJ3aXNlX2Rpc3RhbmNlIl0gPC0gIlZQRCIKCgpwbmcoInZhcl9pbXBvcnRfYWxsLnBuZyIsIHdpZHRoID0gMjUsIGhlaWdodCA9IDI1LCB1bml0PSJpbiIsIHJlcz0zMDApCnBhcihtYXIgPSBjKDEwLCAxOCwgMSwgMSkpCnBsb3QoeCA9IHJldihpbXBbLCA1XSksIHkgPSAxOm5yb3coaW1wKSwgdHlwZSA9ICJsIiwgeWF4dCA9ICJuIiwgCiAgICAgeWxhYiA9ICIiLCB4bGFiID0gIlZhcmlhYmxlIEltcG9ydGFuY2UiLAogICAgIHhsaW0gPSBjKDAsIDEpLCBsd2QgPSAyLCBjZXgubGFiID0gNCkKZm9yIChpIGluIDE6bnJvdyhpbXApKSB7CiAgYWJsaW5lKGggPSBpLCBsdHkgPSAzLCBjb2wgPSAiZ3JheTgwIikKfQphYmxpbmUodiA9IHNlcSgwLCAxLCAxLzE5KSwgbHR5ID0gMywgY29sID0gImdyYXk4MCIpCgpsaW5lcyh4ID0gcmV2KGltcFssIDRdKSwgeSA9IDE6bnJvdyhpbXApLCBjb2wgPSAiZGFya2dyZWVuIiwgbHdkID0gMikKbGluZXMoeCA9IHJldihpbXBbLCAzXSksIHkgPSAxOm5yb3coaW1wKSwgY29sID0gInJlZCIsIGx3ZCA9IDIpCmxpbmVzKHggPSByZXYoaW1wWywgMl0pLCB5ID0gMTpucm93KGltcCksIGNvbCA9ICJibHVlIiwgbHdkID0gMikKbGluZXMoeCA9IHJldihpbXBbLCAxXSksIHkgPSAxOm5yb3coaW1wKSwgY29sID0gImRhcmtvcmFuZ2UxIiwgbHdkID0gMikKbGluZXMoeCA9IHJldihpbXBbLCA1XSksIHkgPSAxOm5yb3coaW1wKSwgbHdkID0gMykKCnBvaW50cyh4ID0gcmV2KGltcFssIDRdKSwgeSA9IDE6bnJvdyhpbXApLCBjb2wgPSAiZGFya2dyZWVuIiwgY2V4ID0gMikKcG9pbnRzKHggPSByZXYoaW1wWywgM10pLCB5ID0gMTpucm93KGltcCksIGNvbCA9ICJyZWQiLCBjZXggPSAyKQpwb2ludHMoeCA9IHJldihpbXBbLCAyXSksIHkgPSAxOm5yb3coaW1wKSwgY29sID0gImJsdWUiLCBjZXggPSAyKQpwb2ludHMoeCA9IHJldihpbXBbLCAxXSksIHkgPSAxOm5yb3coaW1wKSwgY29sID0gImRhcmtvcmFuZ2UxIiwgY2V4ID0gMikKcG9pbnRzKHggPSByZXYoaW1wWywgNV0pLCB5ID0gMTpucm93KGltcCksIHBjaCA9IDIwLCBjZXggPSAzKQoKCnRleHQoeSA9IDE6bnJvdyhpbXApLCB4ID0gcGFyKCJ1c3IiKVsxXSAtIC4xNywgbGFiZWxzID0gcmV2KG5hbWVzKSwKICAgICBzcnQgPSAwLCBwb3MgPSA0LCB4cGQgPSBULCBjZXggPSA0KQpkZXYub2ZmKCkKYGBgCgohW10odmFyX2ltcG9ydF9hbGwucG5nKQoKCgoKYGBge3J9CnBhcihtZnJvdz1jKDIsMykpCgojIEJveCBwbG90cwpib3hwbG90KHNwYXRpYWwudGVzdHMuZm9yYSB+IE1vZGVsLCBkYXRhID0gZGF0YS5hbmFseXNpcy5jb21wMykKYWJsaW5lKGggPSBhJHNwYXRpYWwudGVzdHMuZm9yYSwgY29sID0gInJlZCIsIGx0eSA9IDIpCgpib3hwbG90KHNwYXRpYWwudGVzdHMuZG9tIH4gTW9kZWwsIGRhdGEgPSBkYXRhLmFuYWx5c2lzLmNvbXAzKQphYmxpbmUoaCA9IGEkc3BhdGlhbC50ZXN0cy5mb3JhLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKCmJveHBsb3QobG9nKHNwcmF0ZSkgfiBNb2RlbCwgZGF0YSA9IGRhdGEuYW5hbHlzaXMuY29tcDMsIHlsaW0gPSBjKC0xMCwgMTApKQphYmxpbmUoaCA9IGxvZyhhJHNwcmF0ZSksIGNvbCA9ICJyZWQiLCBsdHkgPSAyKQoKYm94cGxvdChsb2coZXh0cmF0ZSkgfiBNb2RlbCwgZGF0YSA9IGRhdGEuYW5hbHlzaXMuY29tcDMsIHlsaW0gPSBjKC0xMCwgMTApKQphYmxpbmUoaCA9IGxvZyhhJGV4dHJhdGUpLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKCmJveHBsb3QobG9nKHRyYW5zaXRpb25fcmF0ZV9yYXRpb18xdG8yX292ZXJfMnRvMSkgfiBNb2RlbCwgZGF0YSA9IGRhdGEuYW5hbHlzaXMuY29tcDMpCmFibGluZShoID0gbG9nKGEkc3ByYXRlKSwgY29sID0gInJlZCIsIGx0eSA9IDIpCgpib3hwbG90KFBoeWxvZ2VuZXRpY19zaWduYWwgfiBNb2RlbCwgZGF0YSA9IGRhdGEuYW5hbHlzaXMuY29tcDMsIHlsaW0gPSBjKDAsIDEpKQphYmxpbmUoaCA9IGEkUGh5bG9nZW5ldGljX3NpZ25hbCwgY29sID0gInJlZCIsIGx0eSA9IDIpCgoKYGBgCgoKCmBgYHtyfQojYnVpbGQgYSBkYXRhIHRyYWNraW5nIHRhYmxlIHRvIHRyYWNrIHBhcmFtZXRlciBjaGFuZ2VzIHRocm91Z2ggdGltZQoKc3RyKGZpdCkKCgoKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=